package adminModels

import (
	"appService/src/application/app/appModels"
	"errors"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gvalid"
	"xorm.io/builder"
	"xorm.io/xorm"
)

//菜单权限权限表
type Auth struct {
	Id             string   `json:"id" xorm:"varchar(128) pk notnull unique"`       //id guid
	AuthGroupId    string   `json:"auth_group_id" xorm:"varchar(128) notnull"`      //权限组ID
	Pid            string   `json:"pid" xorm:"varchar(128)"`                        //父id
	Title          string   `json:"title" xorm:"varchar(64)"`                       //名称
	Route          string   `json:"route" xorm:"varchar(255)"`                      //菜单路由
	Icon           string   `json:"icon" xorm:"varchar(255)"`                       //图标 图片为空才显示图标
	Img            string   `json:"img" xorm:"varchar(255)"`                        //图片 图片优先
	IconColor      string   `json:"icon_color" xorm:"varchar(32)"`                  //图标的背景颜色
	Visit          int      `json:"visit" xorm:"tinyint(1) notnull default(1)"`     //访问权限 1公开，2登录，3权限，4,系统管理员
	AuthType       int      `json:"auth_type" xorm:"tinyint(1) notnull default(1)"` //菜单类型 1菜单，2
	DefaultApiList []string `json:"default_api_list" xorm:"text json"`              //页面默认数据接口ID列表
	ApiList        []string `json:"api_list" xorm:"text json"`                      //页面对应数据接口列表
	IsShow         int      `json:"is_show" xorm:"tinyint(1) notnull default(1)"`   //是否显示 1显示 2隐藏
	Disabled       int      `json:"disabled" xorm:"tinyint(1) notnull default(1)"`  //是否禁用 1启用 2禁用
	Sort           int      `json:"sort" xorm:"int(11) notnull default(1)"`         //排序
}

//添加数据校验
func (this *Auth) AddValid() error {
	rules := []string{
		"Id@required#ID不能为空",
		"AuthGroupId@required#请选择菜单权限组",
		"Title@required#菜单名称不能为空",
		"Visit@required#请选择访问权限",
		"AuthType@required#请选择菜单类型",
	}
	err := gvalid.CheckStruct(this, rules, nil)
	if err == nil {
		return nil
	} else {
		return errors.New(err.FirstString())
	}
}

//修改数据校验
func (this *Auth) EditValid() error {
	return this.AddValid()
}

//获取模型
func (this *Auth) Model() interface{} {
	return new(Auth)
}

//获取模型切片
func (this *Auth) Slice() interface{} {
	return new([]Auth)
}

//初始化数据
func (this *Auth) Init(db *xorm.Session, guid string, loginUser *appModels.UserInfo) error {
	this.Id = guid
	return nil
}

//添加之前调用，判断是否可添加，设置添加条件等
func (this *Auth) AddWhere(db *xorm.Session, loginUser *appModels.UserInfo) error {
	if this.Route != "" {
		has, err := db.Where(builder.Eq{"route": this.Route}).Exist(new(Auth))
		if err != nil {
			g.Log().Errorf("添加菜单，查询路由【%v】是否存在，错误：%v", this.Route, err)
			return errors.New("添加失败")
		}
		if has {
			return errors.New("菜单【路由】已经存在")
		}
	}
	return nil
}

//删除之前调用，判断是否可删除，设置删除条件等
func (this *Auth) DeleteWhere(db *xorm.Session, loginUser *appModels.UserInfo, ids ...string) error {
	for _, id := range ids {
		has, err := db.Where(builder.Eq{"pid": id}).Exist(new(Auth))
		if err != nil {
			g.Log().Errorf("查询【菜单】是否可以删除，错误：%v", err)
			return errors.New("获取删除内容失败")
		}
		if has {
			return errors.New("删除的【菜单】中，存在子菜单")
		}
	}
	db.In("id", ids)
	return nil
}

//修改之前调用，判断是否可修改，设置修改条件
func (this *Auth) EditWhere(db *xorm.Session, loginUser *appModels.UserInfo) error {
	if this.Id == "" {
		return errors.New("请选择要修改的数据")
	}
	if this.Route != "" {
		has, err := db.Where(builder.Eq{"route": this.Route}.And(builder.Neq{"id": this.Id})).Exist(new(Auth))
		if err != nil {
			g.Log().Errorf("添加菜单，查询路由【%v】是否存在，错误：%v", this.Route, err)
			return errors.New("添加失败")
		}
		if has {
			return errors.New("菜单【路由】已经存在")
		}
	}
	db.Where(builder.Eq{"id": this.Id})
	return nil
}

//查询一条数据条件
func (this *Auth) GetWhere(db *xorm.Session, loginUser *appModels.UserInfo, id string) error {
	return nil
}

//查询列表条件、查询分页数据条数条件
func (this *Auth) ListWhere(db *xorm.Session, loginUser *appModels.UserInfo) error {
	db.Asc("sort")
	db.Where(builder.Eq{"auth_group_id": this.AuthGroupId})
	return nil
}

//查询分页时条件
func (this *Auth) PaginateWhere(db *xorm.Session, loginUser *appModels.UserInfo) error {
	return nil

}
